home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 13, No. 01 (1992-01)(MindCraft Publishing)(Side A).zip
/
Nibble Volume 13, No. 01 (1992-01)(MindCraft Publishing)(Side A).po
/
AMPERCIPHER.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
4KB
|
126 lines
*************************
* AMPERCIPHER *
* by Rich Skrenta *
* Copyright (C) 1992 *
* MindCraft Publ. Corp. *
* Lincoln, MA 01773 *
*************************
* Merlin Assembler *
*************************
CHRGET EQU $B1
CHRGOT EQU $B7
LASTVAR EQU $81
VARPNT EQU $83
RND EQU $C9
PTRGET EQU $DFE3
CHKCOM EQU $DEBE
ERR EQU $DEC9
RANDOM EQU $EFB4
AMPER EQU $3F5
*
LEN1 EQU $00
LEN2 EQU $01
PTR1 EQU $FC
PTR2 EQU $FE
*
ORG $300
LDA #$4C ;STORE A JUMP INSTRUCTION
STA AMPER ;TO THE CIPHER PROGRAM
LDA #<START ;IN THE AMPERSAND
STA AMPER+1 ;VECTOR
LDA #>START
STA AMPER+2
RTS ;RETURN TO CALLING PROGRAM
*
START PHA ;SAVE THE CHAR AFTER "&"
JSR CHRGET ;ADVANCE TXTPTR
JSR GETSTR ;GET THE MESSAGE STRING
STX LEN1 ;STORE LENGTH
STA PTR1 ;AND A POINTER TO THE
STY PTR1+1 ;ACTUAL STRING
JSR GETSTR ;GET THE PASSWORD STRING
STX LEN2
STA PTR2
STY PTR2+1
*
LDX #5 ;INDEX TO INIT RND SEED
LDA LEN2 ;INIT WITH PASSWORD LENGTH
CLEAR STA RND-1,X ;STORE IN EACH FP LOC
DEX
BNE CLEAR ;LOOP UNTIL DONE
*
CLC ;CLEAR FOR ADDITION
LDY LEN2 ;DO FOR EACH CHAR IN PASSWORD
DEY
SEED LDX #5 ;5 BYTE FP SEED
SEED2 LDA (PTR2),Y ;GET PASSWORD CHAR
ADC RND-1,X ;ADD TO SEED BYTE
STA RND-1,X ;STORE IT
DEC LEN2 ;NEXT PASSWORD CHAR
BEQ START4 ;BRANCH IF DONE
DEX ;NEXT FP SEED LOCATION
BNE SEED2
BEQ SEED ;IF MORE THAN 5 CHAR PASSWORD
START4 PLA ;GET CHAR AFTER "&"
SEC ;FOR SUBTRACTION
SBC #'D' ;0=DECODE,1=ENCODE
CMP #2 ;IN RANGE?
BCC SETOP ;YES, GO TO CODER
SNERR JMP ERR ;?SYNTAX ERROR
*
GETSTR JSR CHRGOT ;GET A CHAR
JSR CHKCOM ;MAKE SURE IT'S ","
JSR PTRGET ;GET A VARIABLE
LDA LASTVAR ;TEST LETTERS OF NAME
BMI SNERR ;TO MAKE SURE IT'S
LDA LASTVAR+1 ;A STRING VARIABLE
BPL SNERR ;(1ST POS, 2ND NEG)
LDY #0 ;INDEX
LDA (VARPNT),Y ;GET THE LENGTH
BEQ SNERR ;NULL STRINGS NOT ALLOWED
TAX
INY
LDA (VARPNT),Y ;GET THE ADDRESS OF THE
PHA ;STRING
INY
LDA (VARPNT),Y
TAY
PLA
RTS ;X=LENGTH, Y,A POINT TO STRING
*
SETOP TAY ;1=ENCODE,0=DECODE
LDA REF1,Y ;GET THE RIGHT OPERATIONS
STA OP1 ;CLC & ADC FOR ENCODING
LDA REF2,Y ;SEC & SBC FOR DECODING
STA OP2
*
CODE LDX #1 ;THE "1" IN RND(1)
JSR RANDOM ;FORM A RANDOM NUMBER IN FAC & RND
LDX #4 ;INDEX FOR MANTISSA
LDA #0 ;START WITH 0
CLC ;AND ADD UP THE 4 BYTES
CODE2 ADC RND,X ;OF THE MANTISSA
DEX ;INTO ONE BYTE
BNE CODE2 ;LOOP IF NOT DONE
AND #%00011111 ;RESTRICT RANGE TO 0-31
STA LEN2
LDY LEN1 ;INDEX FOR CODE MESSAGE
DEY
LDA (PTR1),Y ;GET THE CHAR
OP1 CLC ;ADD OR SUBTRACT
OP2 ADC LEN2 ;TO ENCODE OR DECODE THE CHAR
CMP #32 ;IN RANGE?
BCS CODE3 ;YES, LEAVE IT ALONE
CLC ;NO, ADD SOME
ADC #94
CODE3 CMP #126 ;IN RANGE?
BCC CODE4 ;YES, LEAVE ALONE
SEC ;NO, SUBTRACT SOME
SBC #94
CODE4 STA (PTR1),Y ;PUT THE CHAR BACK
DEC LEN1 ;MOVE ON TO THE NEXT ELEMENT
BNE CODE ;REPEAT IF NOT FINISHED
RTS ;BACK TO BASIC
REF1 DFB $38,$18 ;SEC & CLC
REF2 DFB $E5,$65 ;SBC & ADC